package org.zs.asp02;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ApsLog {
    /**
     * 获取目标方法信息：
     * 1 在通知方法的参数中添加固定类型的对象即可！ aop就回自动给你传递！ 你就可以获取 【不是必须】
     * 2所有通知汇总通可以传递JoinPoint对象，可以获取目标方法的信息（类、方法名、参数......）
     * 3 返回通知@AfterReturning 可以额外获取方法的返回值，值需要在参数中添加Object对象
     * 4 异常通知@AfterThrowing 可以额外获取本次异常信息系，Throwable对象即可
    *
    * */

    @Before(value = "execution(* org..aop02..Impl.*.*(..))")
    public void begin(JoinPoint joinPoint)
    {
        // 获取目标对象（当前方法所属的对象）       
        Object target = joinPoint.getTarget();
        // 目标类的名称
        String name = target.getClass().getName();
        // 获取目标对象的名称
        String methodName = joinPoint.getSignature().getName();
        // 获取目标对象的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("类：" + name + "方法：" + methodName + "传入参数：" + args.toString() + "开始执行......");
        System.out.println("ApsLog方法执行之前");
    }
    // 结束通知 @AfterReturning
    @AfterReturning(value = "execution(* org..aop02..Impl.*.*(..))", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result)
    {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println("类：" + className + "方法：" + methodName + "正常执行完毕了.......返回值：" + result);
    }

    // 报错通知 @AfterThrowing
    @AfterThrowing(value = "execution(* org..aop02..Impl.*.*(..))", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Throwable e)
    {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println("类：" + className + "方法：" + methodName + "异常了.......异常信息：" + e.getMessage());
    }

}
